﻿/*
题目：交替子数组计数

给你一个二进制数组 nums 。

如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况，我们称这样的子数组为 交替子数组 。

返回数组 nums 中交替子数组的数量。

https://leetcode.cn/problems/count-alternating-subarrays/description/?envType=daily-question&envId=2024-07-06
*/

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include "TreeNode.hpp"
#include "ListNode.hpp"
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <functional>

using namespace std;

class Solution {
public:
    // 滑动窗口：遇到不合符的就可以马上结算了
    // 子数组个数使用：求和公式 n(a1 + an) / 2
    long long countAlternatingSubarrays(vector<int>& nums) {
        long long res = 0L;

        // 找到最大子数组，然后统计其中子数组个数
        int left = 0;
        int n = nums.size();
        for (int i = 1; i < n; i++) {
            if (nums[i] != nums[i - 1])     continue;   // 这里可能漏算

            if (nums[i] == nums[i - 1]) {
                res += (((long long)i - left) * (1 + (i - left))) / 2; // 结算该范围子数组个数
                left = i;
            }
        }
        // 在结算一次
        res += (((long long)n - left) * (1 + (n - left))) / 2;

        return res;
    }
};
